$Description$
假设有来自$m$个不同单位的代表参加一次国际会议。每个单位的代表数分别为$r_i(1\leqslant i\leqslant m)$。
会议餐厅共有$n$张餐桌,每张餐桌可容纳$c_i(1\leqslant i\leqslant n)$个代表就餐。
为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐。试设计一个算法,给出满足要求的代表就餐方案。
对于给定的代表数和餐桌数以及餐桌容量,编程计算满足要求的代表就餐方案。
$Solution$
贪心做法
把桌子和单位的规模分别从大到小排个序(其实桌子拍不拍序没什么影响)。因为单位规模越大就越难满足,所以我们优先考虑他们;
而对于桌子你可以这样想,你桌子数量越多显然更容易满足题意,又因为小桌子很快会坐满而导致不能用,所以我们优先坐大桌子。
还有一种最大流的做法
考虑对桌子和单位构点。从源点连容量为$r_i$的边到单位$i$,从餐桌$i$连容量为$c_i$的边到汇点。
注意到每个单位只能在每张桌子上放一个人。考虑从每个单位向每张桌子连一条容量为$1$的边。
如果最大流小于人数和则无解。
否则对于每个单位,枚举它的出边,输出满流边的终点即可。
$Code$
只贴了贪心的代码
1 |
|